import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.Scanner;

import com.distribuida.servidor.interfaces.ServidorInterface;
import com.distribuida.supertrunfo.comum.Carta;
import com.distribuida.supertrunfo.comum.Jogador;
import com.distribuida.supertrunfo.comum.Opcoes;

public class ClientImpl {

	public static ServidorInterface servidor = null;
	public static Jogador jogador = null;
	static int numJogadas = 0;

	public static void main (String[] args) throws Exception {
		try {
			servidor = (ServidorInterface) Naming.lookup ("//" + args[0]+"/Servidor");
			System.out.println("\nPor favor, digite o seu nome: ");
			jogador = servidor.adicionarJogador(new Scanner(System.in).next());
			System.out.println("\nEste eh o seu ID de cliente: " + jogador.getId());
			System.out.println("\nVoce Esta conectado ao jogo: " + jogador.getId_jogo());
			System.out.println("\nPor Favor, aguarde");
		} catch (Exception e) {
			System.out.println ("SuperTrunfo failed.");
			e.printStackTrace();
		}
		while(true){
			try {
				Integer opcao = servidor.getOperacaoJogador(jogador.getId_jogo(), jogador.getId());
				if(opcao == null){
					throw new Exception("opcao nula!");
				}
				if(opcao == Opcoes.JOGAR.ordinal()){
					jogar();
				}else if(opcao == Opcoes.ESPERAR.ordinal()){
					if(servidor.jogoTerminou(jogador.getId_jogo())){
						finalizarJogo();
					}
				}else if(opcao == Opcoes.VENCEDOR_GERAL.ordinal()){
					finalizarJogo();
				}else if(opcao == Opcoes.VENCEDOR_RODADA.ordinal()){
					finalizarRodada(true);
					Thread.sleep(1000);
				}
			} catch (RemoteException e) {
				e.printStackTrace();
				System.exit(1);
			}
		}
	}

	public static void jogar() throws RemoteException{
		if(!servidor.jogoTerminou(jogador.getId_jogo())){
			long time  = System.currentTimeMillis();
			System.out.println("\nEh a sua vez de Jogar! ");
			System.out.println("\nSua carta: ");
			Carta carta = servidor.getCarta(jogador.getId_jogo(), jogador.getId());
			if(carta != null){
				System.out.println(carta.toString());
				System.out.println("\nEscolha uma caracteristica(ID): ");
				int escolha = -1;
				boolean acertou = false;
				while(!acertou){
					try{
						escolha = Integer.parseInt(new Scanner(System.in).next());
						if(!(escolha >=4 && escolha<=7)){
							System.out.println("Por favor, digite um numero de 4 a 7");
						}else{
							acertou = true;
						}
					}catch(Exception e){
						System.out.println("Por favor, digite um numero de 4 a 7");
						acertou = false;
					}                        	    
				}
				
				long currenttime = System.currentTimeMillis();
				int segundos = (int) ((currenttime - time)/1000);
				
				if(!(segundos >= 60))
					servidor.escolherCaracteristica(jogador.getId_jogo(), String.valueOf(escolha));
				
				finalizarRodada(false);
			}else{
				finalizarRodada(false);
			}
		}else{
			finalizarJogo();
		}
	}
	public static void finalizarJogo()throws RemoteException{
		System.out.println("\nFim de Jogo!");
		System.out.println("\nE o Vencedor do jogo �: ");
		for(Jogador jog : servidor.retornaVencedor(jogador.getId_jogo())){
			System.out.println(jog.getNome() + " com: " + jog.getVitorias() + " pontos");
		}	
		System.exit(0);

	}

	public static void finalizarRodada(boolean mostra)throws RemoteException{
		if(mostra){
			System.out.println("\nSua carta: ");
			System.out.println(servidor.getCartaRodadaAnterior(jogador.getId_jogo(), jogador.getId()).toString());			    
		}
		System.out.println("\nE o Vencedor da rodada �: ");
		for(Jogador jog : servidor.retornaVencedorRodada(jogador.getId_jogo())){
			System.out.println(jog.getNome() + " com: " + jog.getVitorias() + " pontos");
		}	
	}

	
	public static void leituraTeclado() {
		 Scanner leitura = new Scanner(System.in);
		 System.out.println("Informe a operação: ");
	     String valorString = leitura.next();
	     process(valorString);
	     leitura.close();
	}
	
	public static void leituraArquivo() {
		try {
			String arq = "/home/gustavo/Desktop/distribuida/testes/teste-000.in";
			BufferedReader in = new BufferedReader(new FileReader(arq));
			String str;
			while (in.ready()) {
				str = in.readLine();
				process(str);
			}
			in.close();
		} catch (IOException e) {
			
		}
	}
	
	public static void process(String linha) {
		String[] part = linha.split("\t");
		if (part[0].equals("")) 
			return; 
		int resp = -10;
		if (part[0].equals("0")) {
			String[] part2 = part[1].split(":");
			//TODO ADD Jogador passando part2[0] - Nome e part2[1] - Id
			System.out.println(resp + "\n");
		} else if (part[0].equals("1")) {
			//TODO ADD Jogador passando part[1]
			System.out.println(resp + "\n");
		} else if (part[0].equals("2")) {
			String[] part2 = part[1].split(":");
			//TODO escolher caracteristica passando part2[0] - Id Jogador part2[1] - Caracteristica
			System.out.println(resp + "\n");
		} else if (part[0].equals("3")) {
			//TODO passa o part[1] - Id do jogador
			System.out.println(resp + "\n");
		} else if (part[0].equals("4")) {
			//TODO passa part[1] - Id do jogador
			System.out.println(resp + "\n");
		} else {
			numJogadas = Integer.parseInt(part[0]);
		}
	}

}
